<?php
/**
 * redis队列处理类
 * @author hjc19850430@gmail.com
 */
class RedisQueue 
{
    private $_redis;                         //定义redis对象
    private $_queuePrefix = 'queue_table_'; //队列前缀
    private $_tbNum;                        //redis存储表数量
    
    /**
     * 初始化
     */
    public function __construct($tbNum = 2)
    {
        //判断redis加载是否成功
        if ( !extension_loaded('redis') ) {
            throw_exception('redis failed to load!');
        }
        
        //redis连接操作
        $this->_redis = new Redis();
        $this->_redis->connect(C('REDIS_HOST'),C('REDIS_PORT'));
        
        //密码验证操作
        if ( !$this->_redis->auth(C('REDIS_PASS')) ) {
            throw_exception('redis auth failed!');
        }
        
        //redis数据库选择最后一个库，最为队列
        $this->_redis->select(10);
        
        //redis存储表的数量
        $this->_tbNum = $tbNum ? $tbNum : 2;
    }
    
    /**
     * 入队列
     * @param string $value 如队列的值
     */
    public function push($value)
    {
        $queueName = $this->_queuePrefix . rand(1, $this->_tbNum);

        try {
            $res = $this->_redis->rpush($queueName, $value);
            return $res;
        } catch (Exception $ex) {
            throw_exception($ex->getMessage());
        }        
    }
    
    /**
     * 从队列中获取一条记录，取数据时采用阻塞版的出列方式
     * @param string $key       队列名称
     * @param string $timeout   超时时间,以秒为单位
     */
    public function pop($key, $timeout)
    {
        try {
            $res = $this->_redis->brpop($key, $timeout);
            if ($res) {
                return $res[1];
            }
        } catch (Exception $ex) {
            throw_exception($ex->getMessage());
        }
    }
    
    /**
     * 获得队列下面的所有键
     */
    public function getListKeys()
    {
        $listKey = array();
        
        for ($index = 0; $index < count($listKey); $index++) {
            $listKey[] = $this->_queuePrefix.$index;
        }
        return $listKey;
    }
}
